﻿using System;
using System.Net;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Documents;
using System.Windows.Ink;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Animation;
using System.Windows.Shapes;
using AssessmentTool.Controls;
using AssessmentTool.ServiceBridge;
using ModelLayer;
using AssessmentTool.Services.DTO;
using System.Linq;
using AssessmentTool.PresentationLogic.EventArguments;
using System.Collections.Generic;
using System.Windows.Media.Imaging;
using System.IO;
using System.Windows.Printing;


using System.Collections;

using AssessmentTool.PresentationLogic.PDF;

using System.Collections.ObjectModel;
using AssessmentTool.Services;
using System.ComponentModel;

namespace AssessmentTool.PresentationLogic.Controllers
{

    public class ProfiliController:AbstractController<Profili>
    {
        
        ReportRadarInfoDTO reportRadarSelected;
        PDFGenerator pdfGenerator;
        public ProfiliController(Profili element)
            : base(element)
        {
            ed.subscrive("GOPROFILE", viewProfiles);
            ed.subscrive("CARICARADAR", selectedProfilo);
         
            pdfGenerator = new PDFGenerator();
        }


        
        public void exportProfilo()
        {

            pdfGenerator.generateRadarPDF(element.radar, reportRadarSelected);
             
        }

        

      

        public void viewProfiles(EventArgs e)
        {
            UtenteServiceBridge.getProfiliInfo((Utente)Session.getInstance().getValue("USER"), visualizzaRadar);

        }

        public void visualizzaRadar(object sender, getProfiliInfoCompletedEventArgs e)
        {
            element.noRadarMessage();
            reportRadarSelected = null;
            
            if (e.Error == null)
            {
                var profili = e.Result.OrderByDescending(x => x.PercentualeProssimita);
                element.clearProfili();
                foreach (ProfiliDTO profilo in profili)
                {
                    ProfiloButton button = new ProfiloButton();
                    button.initWithProfilo(profilo);
                    element.addProfilo(button);
                }
                element.Visibility = Visibility.Visible;
                ed.dispatch("VIEWPROFILE", null);
            }
            else
            {
                ed.dispatch("SHOWMESSAGE", new ShowMessageEventArgs() { Testo = "Errore critico nella richiesta...", Critico = true, Error = true });
            }
            
            ed.dispatch("STOPBUSY", null);
        }
        public void selectedProfilo(EventArgs e)
        {
            RadarEventArgs arg= ((RadarEventArgs)e);
            
            element.visualizzaRadar();
            element.setTitoloProfilo(arg.profilo.NomeProfilo);
            reportRadarSelected = new ReportRadarInfoDTO();
            reportRadarSelected.profili = arg.profilo;
            reportRadarSelected.utente = (Utente)Session.getInstance().getValue("USER");
            List<String> competenzeInPiu = new List<string>();
            List<String> competenzeMancanti = new List<string>();
            List<String> competenzeMancantiMaSufficenti = new List<string>();

            foreach (ProfiloCompetenzaDTO dto in arg.profilo.Competenze)
            {
                foreach(ModelLayer.Competenza comp in dto.CompetenzeInPiu)
                {
                    competenzeInPiu.Add(comp.Codice + " " + new ApplicationResources().Get(comp.Codice));
                }
                foreach(ModelLayer.Competenza comp in dto.CompetenzeMancanti)
                {
                    competenzeMancanti.Add(comp.Codice + " " + new ApplicationResources().Get(comp.Codice));
                }
                foreach (ModelLayer.Competenza comp in dto.CompetenzeMancantiMaSufficenti)
                {
                    competenzeMancantiMaSufficenti.Add(comp.Codice + " " + new ApplicationResources().Get(comp.Codice));
                }
            }
         

           


            element.Mancanti.init(
            "Principali aree di competenza da sviluppare ulteriormente per corrispondere al profilo " + arg.profilo.NomeProfilo + ". ",
            "Le aree si riferiscono prevalentemente alla capacità di saper realizzare quanto prescritto a livello teorico e non riportano le carenze rispetto al livello Core in quanto, per definizione, tutte le competenze di questo livello sono prerequisito per tutti i profili EUCIP Elective.",
            competenzeMancanti,
            "Aree di competenza carenti",
            "");
            element.MancantiMaSufficenti.init(
            "",
            "",
            competenzeMancantiMaSufficenti,
            "Aree le cui competenze sono presenti ma ad un livello inferiore a quanto richiesto dal profilo",
            "Se vuoi completare il possesso delle tue competenze per il profilo da te selezionato, ti consigliamo di costruire un valido percorso formativo in grado di coprire le competenze mancanti, tenendo comunque conto anche delle eventuali certificazioni informatiche delle quali sei già in possesso e dei corsi ai quali ha già partecipato.");

            element.Eccedenti.init(
            "Principali Aree di competenza possedute in modo piu' approfondito rispetto al profilo " + arg.profilo.NomeProfilo + ".",
            "",
            competenzeInPiu,
            "Aree di competenza eccedenti il livello richiesto",
            "");


        }


       
    }
}
